package com.yupi.springbootinit.manager;

import com.yupi.springbootinit.common.ErrorCode;
import com.yupi.springbootinit.exception.ThrowUtils;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 专门提供redisLimiter限流服务的 (提供了通用的能力,放到哪个项目都能用)
 */
@Service
public class RedisLimiterManager {

    @Resource
    RedissonClient redissonClient;

    /**
     * 限流实现
     *
     * @param key 区分不同的限流器,比如不同的用户id应该分别统计
     */
    public void doRateLimit(String key) {
        //根据key创建限流器,每秒最多访问2次
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
        //每当一个操作来了后,请求一个令牌
        boolean canOp = rateLimiter.tryAcquire(1);
        ThrowUtils.throwIf(!canOp, ErrorCode.PARAMS_ERROR);
    }
}
